#include "Menu.h"
#include "Key.h"
#include "LCD.h"

bool IS_Change = true;               // 是否改变
/**************************************************************************************
* Variable definition                                               
**************************************************************************************/

//----------------------------------   主菜单   ---------------------------------------
MENU_PRMT GSetPrmt = {0};                    // 定义常规设置参数
MENU_TABLE GeneralSet[] =                    // 定义主菜单表
{
    {(const uint8_t *)"1.page1", Menu_Profile},      // 使用函数指针而不是函数调用
    {(const uint8_t *)"2.page2", Menu_Null},
    {(const uint8_t *)"3.page3", Menu_Null},
};

//-----------------------------------   二级菜单  -------------------------------------
MENU_PRMT ProfilePrmt = {0};                 // 定义情景模式参数
MENU_TABLE Profile[] =                       // 定义二级菜单表
{
    {(const uint8_t *)"4. page4     ", Menu_Null},
    {(const uint8_t *)"5. page5     ", Menu_Null},
    {(const uint8_t *)"6. page6     ", Menu_Null},
    {(const uint8_t *)"7. page7     ", Menu_Null},
};

/**************************************************************************************
* FunctionName   : Menu_Null()
* Description    : 空函数
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
void Menu_Null(void)
{
     DMA_Printf("Menu_Null called\n");  // 添加调试信息
}

/**************************************************************************************
* FunctionName   : Menu_PrmtInit()
* Description    : 初始化菜单参数
* EntryParameter : prmt - 菜单参数, num - 显示项, page - 显示页
* ReturnValue    : None
**************************************************************************************/
void Menu_PrmtInit(MENU_PRMT *prmt, uint8_t num, uint8_t page)
{
    prmt->ExitMark = 0;                     // 清除退出菜单标志
    prmt->Cursor   = 0;                     // 光标清零
    prmt->PageNo   = 0;                     // 页清零
    // prmt->Index    = 0;                     // 索引清零
    prmt->DispNum  = num;                    // 页最多显示项目数
    prmt->MaxPage  = page;                   // 最多页数
}

/**************************************************************************************
* FunctionName   : Menu_Display()
* Description    : 显示菜单
* EntryParameter : page - 显示页，dispNum - 每一页的显示项，cursor - 光标位置
* ReturnValue    : None
**************************************************************************************/
void Menu_Display(MENU_TABLE *menu, uint8_t page, uint8_t dispNum, uint8_t cursor)
{
    uint8_t i;
    const uint8_t arrow[] = {'-', '>', '\0'};  // 定义箭头字符串为 uint8_t 类型
    static uint8_t last_cursor = 0;

    Menu_Move(&prmt,MyKey);

    if(last_cursor != cursor)// 光标位置有变化
    {
        LCD_ShowString(30, 90 + last_cursor * 24, arrow, BLACK, BLACK, 24, 0);  // 清除上个光标
        LCD_ShowString(30, 90 + cursor * 24, arrow, WHITE, BLACK, 24, 0);  // 显示这次光标
        last_cursor = cursor;
    }

    if(IS_Change == true)
    {
        for (i=0; i<dispNum; i++)
        {
       
            LCD_ShowString(60, 90 + i * 24, menu[page + i].MenuName, WHITE, BLACK, 24, 0);
        }
        IS_Change = false;
    }
}

/**************************************************************************************
* FunctionName   : Menu_Move()
* Description    : 菜单移动
* EntryParameter : prmt - 菜单参数, MyKey - 按键值
* ReturnValue    : 有确认返回0，否则返回1
**************************************************************************************/
/**************************************************************************************
* FunctionName   : Menu_Move()
* Description    : 菜单移动
* EntryParameter : prmt - 菜单参数, MyKey - 按键值
* ReturnValue    : 有确认返回0，否则返回1
**************************************************************************************/
uint8_t Menu_Move(MENU_PRMT *prmt, MyKeyTypeDef* MyKey)
{
    uint8_t rValue = 1;
    uint8_t key = MyKey->KEY_State;
    static uint8_t last_key = 0;  // 使用静态变量保存上次按键状态
    uint8_t move_flag = (key != last_key);  // 如果按键状态改变，则设置 move_flag 为 1

    if (move_flag) 
    {
        switch (key)
        {
            case 1:  // 下移
                prmt->Cursor++;
                if (prmt->Cursor >= prmt->DispNum) prmt->Cursor = 0;
                prmt->Index = prmt->Cursor;  // 更新 Index 与 Cursor 同步
                DMA_Printf("Cursor moved to %d\n", prmt->Cursor);
                DMA_Printf("Index updated to %d\n", prmt->Index);
                break;
            case 2:  // 确定
                rValue = 0x00;
                DMA_Printf("Menu_Move called with Index %d\n", prmt->Index);
                if (prmt->Index == 0)  // 检查是否指向 page1
                {
                    Menu_Profile();
                    DMA_Printf("Entered Menu_Profile from Menu_Move\n");
                }
                else
                {
                    Menu_Process((uint8_t *)" -= AAA =- ", prmt, GeneralSet, sizeof(GeneralSet) / sizeof(GeneralSet[0]));
                    DMA_Printf("Menu_Process called from Menu_Move\n");
                }
                break;
            default:
                break;
        }
    }

    last_key = key;  // 更新 last_key 为当前按键状态
    return rValue;  // 返回是否有移动操作
}


/**************************************************************************************
* FunctionName   : Menu_Process()
* Description    : 处理菜单项
* EntryParameter : menuName - 菜单名称，prmt - 菜单参数，table - 菜单表项, num - 菜单项数
* ReturnValue    : None
**************************************************************************************/
/**************************************************************************************
* FunctionName   : Menu_Process()
* Description    : 处理菜单项
* EntryParameter : menuName - 菜单名称，prmt - 菜单参数，table - 菜单表项, num - 菜单项数
* ReturnValue    : None
**************************************************************************************/
void Menu_Process(uint8_t *menuName, MENU_PRMT *prmt, MENU_TABLE *table, uint8_t num)
{
    LCD_Fill(0, 0, LCD_W, LCD_H, BLACK);  // 清屏 
    if (prmt->Index < num && table[prmt->Index].ItemHook != NULL)  // 检查索引和函数指针
    {
        DMA_Printf("Calling ItemHook at index %d\n", prmt->Index);  // 输出即将调用的函数
        HAL_Delay(20);
        table[1].ItemHook();  // 执行相应项
        DMA_Printf("ItemHook called successfully\n");  // 确认调用成功
    } 
    else 
    {
        // 处理错误情况
        DMA_Printf("Invalid index or function pointer\n");
    }
}

/**************************************************************************************
* FunctionName   : Menu_ExitProfile()
* Description    : 退出情景模式
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
void Menu_ExitProfile(void) 
{
    ProfilePrmt.ExitMark = 0x01;         // 退出情景模式
    LCD_Fill(0,0,LCD_W,LCD_H,BLACK);            // 清屏 
} 

/**************************************************************************************
* FunctionName   : Menu_Profile()
* Description    : 情景模式
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
void Menu_Profile(void)
{
    uint8_t menuNum = sizeof(Profile) / sizeof(Profile[0]);  // 菜单项数
    // Menu_PrmtInit(&ProfilePrmt, menuNum, 1);  // 初始化 ProfilePrmt
    DMA_Printf("Menu_Profile initialized with Index %d\n", ProfilePrmt.Index);
    HAL_Delay(20);
    Menu_Process((uint8_t *)" -= AAA =- ", &ProfilePrmt, Profile, menuNum);
}
